/*
    * ojm_model.cpp
    *
    * Created on: 2024-06-14
    *     Author: van
    */

#include <string>
#include <vector>

#include "nlohmann/json.hpp"

#include "service_site_lib_ojm.h"
#include "service_site_manager.h"

using namespace std;
using namespace servicesite;

using json = nlohmann::json;


void ServiceDebugResponseMessageSubscriberListItemSiteHandleListItem::from_handle(const MessageSubscriberSiteHandle& data) {
    ip = data.ip;
    port = data.port;
    mac = data.mac;
    site_id = data.site_id;

    retry_count = data.require_fresh == 1 ? MessageSubscriberSiteHandle::SEND_RETRY_REFRESH : data.retry_count;
    failed_ts = data.failed_ts;
    stats_cnt_send = data.stats_cnt_send;
    stats_cnt_drop = vector<uint32_t>(data.stats_cnt_drop.begin(), data.stats_cnt_drop.end());
}

json ServiceDebugResponseMessageSubscriberListItemSiteHandleListItem::to_json(void) {
    json json_data = json::object();

    json_data["ip"] = ip;
    json_data["port"] = port;
    json_data["mac"] = mac;
    json_data["site_id"] = site_id;
    json_data["retry_count"] = retry_count;
    json_data["failed_ts"] = failed_ts;

    json json_stats = json::object();
    json_stats["send"] = stats_cnt_send;
    json_stats["drop"] = (json)stats_cnt_drop;
    json_stats["ts"] = (json)MessageSubscriberSiteHandle::get_ts();

    json_data["stats"] = json_stats;

    return json_data;
}

int ServiceDebugResponseMessageSubscriberListItemSiteHandleListItem::from_json(json json_data) {
    if (json_data["ip"].is_string()) {
        ip = json_data["ip"];
    }
    else {
        return -1;
    }

    if (json_data["port"].is_number_integer()) {
        port = json_data["port"];
    }
    else {
        return -2;
    }

    if (json_data["mac"].is_string()) {
        mac = json_data["mac"];
    }
    else {
        return -3;
    }

    if (json_data["site_id"].is_string()) {
        site_id = json_data["site_id"];
    }
    else {
        return -4;
    }

    if (json_data["retry_count"].is_number_integer()) {
        retry_count = json_data["retry_count"];
    }

    // 加载的时候跳过了stats信息, 我们预期代码中不会使用
    if (json_data["failed_ts"].is_number_integer()) {
        failed_ts = json_data["failed_ts"];
    }

    return 0;
}

json ServiceDebugResponseMessageSubscriberListItem::to_json(void) {
    json json_data = json::object();

    json_data["message_id"] = message_id;
    if (!site_handle_list_dbg.empty())
    {
        //debug接口输出
        json_data["site_handle_list_dbg"] = (json)site_handle_list_dbg;
    }
    else
    {
        //订阅持久化
        json_data["site_handle_list"] = json::array();
        for (auto& item : site_handle_list) {
            json_data["site_handle_list"].push_back(item.to_json());
        }
    }

    return json_data;
}

int ServiceDebugResponseMessageSubscriberListItem::from_json(json json_data) {
    //NOTE: 当前版本中debug接口无需反序列化, 此处未做处理
    if (json_data["message_id"].is_string()) {
        message_id = json_data["message_id"];
    }
    else {
        return -1;
    }

    if (json_data.contains("site_handle_list") && json_data["site_handle_list"].is_array()) {
        for (auto& json_item : json_data["site_handle_list"]) {
            if (json_item.is_object()) {
                ServiceDebugResponseMessageSubscriberListItemSiteHandleListItem item;
                item.from_json(json_item);
                site_handle_list.push_back(item);
            }
        }
    }

    if (json_data.contains("site_handle_list_dbg") && json_data["site_handle_list_dbg"].is_array()) {
        for (auto& json_item : json_data["site_handle_list"]) {
            if (json_item.is_string()) {
                site_handle_list_dbg.push_back((string)json_item);
            }
        }
    }

    return 0;
}

json ServiceGetMessageListResponseMessageListItem::to_json(void) {
    json json_data = json::object();

    json_data["message_id"] = message_id;
    json_data["name"] = name;
    json_data["summary"] = summary;

    return json_data;
}

int ServiceGetMessageListResponseMessageListItem::from_json(json json_data) {
    if (json_data["message_id"].is_string()) {
        message_id = json_data["message_id"];
    }

    if (json_data["name"].is_string()) {
        name = json_data["name"];
    }

    if (json_data["summary"].is_string()) {
        summary = json_data["summary"];
    }

    return 0;
}

json AccessServiceAnyGetMessageListRequest::to_json(void) {
    json json_data = json::object();


    return json_data;
}

int AccessServiceAnyGetMessageListRequest::from_json(json json_data) {
    return 0;
}

json AccessServiceAnyGetMessageListResponse::to_json(void) {
    json json_data = json::object();

    json_data["message_list"] = json::array();
    for (auto& item : message_list) {
        json_data["message_list"].push_back(item.to_json());
    }

    return json_data;
}

int AccessServiceAnyGetMessageListResponse::from_json(json json_data) {
    if (json_data["message_list"].is_array()) {
        for (auto& json_item : json_data["message_list"]) {
            if (json_item.is_object()) {
                ServiceGetMessageListResponseMessageListItem item = ServiceGetMessageListResponseMessageListItem();
                item.from_json(json_item);
                message_list.push_back(item);
            }
        }
    }

    return 0;
}

json AccessServiceAnySubscribeMessageRequest::to_json(void) {
    json json_data = json::object();

    json_data["message_list"] = json::array();
    for (auto& item : message_list) {
        json_data["message_list"].push_back(item);
    }
    json_data["ip"] = ip;
    json_data["port"] = port;
    json_data["mac"] = mac;
    json_data["site_id"] = site_id;

    return json_data;
}

int AccessServiceAnySubscribeMessageRequest::from_json(json json_data) {
    if (json_data["message_list"].is_array()) {
        for (auto& json_item : json_data["message_list"]) {
            if (json_item.is_string()) {
                string item = json_item;
                message_list.push_back(item);
            }
        }
    }

    if (json_data["ip"].is_string()) {
        ip = json_data["ip"];
    }

    if (json_data["port"].is_number_integer()) {
        port = json_data["port"];
    }

    if (json_data["mac"].is_string()) {
        mac = json_data["mac"];
    }

    if (json_data["site_id"].is_string()) {
        site_id = json_data["site_id"];
    }

    return 0;
}

json AccessServiceAnySubscribeMessageResponse::to_json(void) {
    json json_data = json::object();


    return json_data;
}

int AccessServiceAnySubscribeMessageResponse::from_json(json json_data) {
    return 0;
}

json AccessServiceAnyUnsubscribeMessageRequest::to_json(void) {
    json json_data = json::object();

    json_data["message_list"] = json::array();
    for (auto& item : message_list) {
        json_data["message_list"].push_back(item);
    }
    json_data["port"] = port;
    json_data["mac"] = mac;
    json_data["site_id"] = site_id;

    return json_data;
}

int AccessServiceAnyUnsubscribeMessageRequest::from_json(json json_data) {
    if (json_data["message_list"].is_array()) {
        for (auto& json_item : json_data["message_list"]) {
            if (json_item.is_string()) {
                string item = json_item;
                message_list.push_back(item);
            }
        }
    }

    if (json_data["port"].is_number_integer()) {
        port = json_data["port"];
    }

    if (json_data["mac"].is_string()) {
        mac = json_data["mac"];
    }

    if (json_data["site_id"].is_string()) {
        site_id = json_data["site_id"];
    }

    return 0;
}

json AccessServiceAnyUnsubscribeMessageResponse::to_json(void) {
    json json_data = json::object();


    return json_data;
}

int AccessServiceAnyUnsubscribeMessageResponse::from_json(json json_data) {
    return 0;
}

json AccessServiceSiteQuerySitePingRequest::to_json(void) {
    json json_data = json::object();

    json_data["site_id"] = site_id;
    json_data["port"] = port;

    return json_data;
}

int AccessServiceSiteQuerySitePingRequest::from_json(json json_data) {
    if (json_data["site_id"].is_string()) {
        site_id = json_data["site_id"];
    }
    if (json_data["port"].is_number_integer()) {
        port = json_data["port"];
    }

    return 0;
}

json AccessServiceSiteQuerySitePingResponse::to_json(void) {
    json json_data = json::object();


    return json_data;
}

int AccessServiceSiteQuerySitePingResponse::from_json(json json_data) {
    return 0;
}

json AccessServiceSiteQuerySiteRegisterRequest::to_json(void) {
    json json_data = json::object();

    json_data["site_id"] = site_id;
    json_data["summary"] = summary;
    json_data["port"] = port;

    return json_data;
}

int AccessServiceSiteQuerySiteRegisterRequest::from_json(json json_data) {
    if (json_data["site_id"].is_string()) {
        site_id = json_data["site_id"];
    }

    if (json_data["summary"].is_string()) {
        summary = json_data["summary"];
    }

    if (json_data["port"].is_number_integer()) {
        port = json_data["port"];
    }

    return 0;
}

json AccessServiceSiteQuerySiteRegisterResponse::to_json(void) {
    json json_data = json::object();


    return json_data;
}

int AccessServiceSiteQuerySiteRegisterResponse::from_json(json json_data) {
    return 0;
}

json ServiceDebugRequest::to_json(void) {
    json json_data = json::object();


    return json_data;
}

int ServiceDebugRequest::from_json(json json_data) {
    return 0;
}

json ServiceDebugResponse::to_json(void) {
    json json_data = json::object();

    json_data["lib_ver"] = lib_ver;

    json_data["message_subscriber_list"] = json::array();
    for (auto& item : message_subscriber_list) {
        json_data["message_subscriber_list"].push_back(item.to_json());
    }
    json_data["message_subscriber_site_handle_list"] = json::array();
    for (auto& item : message_subscriber_site_handle_list) {
        json_data["message_subscriber_site_handle_list"].push_back(item.to_json());
    }

    return json_data;
}

int ServiceDebugResponse::from_json(json json_data) {
    if (json_data["lib_ver"].is_string()) {
        lib_ver = (string)json_data["lib_ver"];
    }
    if (json_data["message_subscriber_list"].is_array()) {
        for (auto& json_item : json_data["message_subscriber_list"]) {
            if (json_item.is_object()) {
                ServiceDebugResponseMessageSubscriberListItem item = ServiceDebugResponseMessageSubscriberListItem();
                item.from_json(json_item);
                message_subscriber_list.push_back(item);
            }
        }
    }

    if (json_data["message_subscriber_site_handle_list"].is_array()) {
        for (auto& json_item : json_data["message_subscriber_site_handle_list"]) {
            if (json_item.is_object()) {
                ServiceDebugResponseMessageSubscriberListItemSiteHandleListItem item;
                item.from_json(json_item);
                message_subscriber_site_handle_list.push_back(item);
            }
        }
    }

    return 0;
}

json ServiceGetMessageListRequest::to_json(void) {
    json json_data = json::object();


    return json_data;
}

int ServiceGetMessageListRequest::from_json(json json_data) {
    return 0;
}

json ServiceGetMessageListResponse::to_json(void) {
    json json_data = json::object();

    json_data["message_list"] = json::array();
    for (auto& item : message_list) {
        json_data["message_list"].push_back(item.to_json());
    }

    return json_data;
}

int ServiceGetMessageListResponse::from_json(json json_data) {
    if (json_data["message_list"].is_array()) {
        for (auto& json_item : json_data["message_list"]) {
            if (json_item.is_object()) {
                ServiceGetMessageListResponseMessageListItem item = ServiceGetMessageListResponseMessageListItem();
                item.from_json(json_item);
                message_list.push_back(item);
            }
        }
    }

    return 0;
}

json ServiceGetServiceListRequest::to_json(void) {
    json json_data = json::object();


    return json_data;
}

int ServiceGetServiceListRequest::from_json(json json_data) {
    return 0;
}

json ServiceGetServiceListResponse::to_json(void) {
    json json_data = json::object();

    json_data["service_list"] = json::array();
    for (auto& item : service_list) {
        json_data["service_list"].push_back(item);
    }

    return json_data;
}

int ServiceGetServiceListResponse::from_json(json json_data) {
    if (json_data["service_list"].is_array()) {
        for (auto& json_item : json_data["service_list"]) {
            if (json_item.is_string()) {
                string item = json_item;
                service_list.push_back(item);
            }
        }
    }

    return 0;
}

json ServiceSiteLibServiceMessage::to_json(void) {
    json json_data = json::object();

    json_data["message_id"] = message_id;
    if (!from.empty())
        json_data["from"] = from;
    json_data["content"] = content;

    return json_data;
}

int ServiceSiteLibServiceMessage::from_json(json json_data) {
    if (json_data["message_id"].is_string()) {
        message_id = json_data["message_id"];
    }

    if (json_data["from"].is_string()) {
        from = json_data["from"];
    }

    if (!json_data["content"].is_null()) {
        content = json_data["content"];
    }

    return 0;
}

json ServiceSiteLibServiceRequest::to_json(void) {
    json json_data = json::object();

    json_data["service_id"] = service_id;
    json_data["to"] = to;
    json_data["request"] = request;

    return json_data;
}

int ServiceSiteLibServiceRequest::from_json(json json_data) {
    if (json_data["service_id"].is_string()) {
        service_id = json_data["service_id"];
    }

    if (json_data["to"].is_string()) {
        to = json_data["to"];
    }

    if (!json_data["request"].is_null()) {
        request = json_data["request"];
    }

    return 0;
}

json ServiceSiteLibServiceResponse::to_json(void) {
    json json_data = json::object();

    json_data["code"] = code;
    json_data["error"] = error;
    json_data["response"] = response;

    return json_data;
}

int ServiceSiteLibServiceResponse::from_json(json json_data) {
    if (json_data["code"].is_number_integer()) {
        code = json_data["code"];
    }

    if (json_data["error"].is_string()) {
        error = json_data["error"];
    }

    if (!json_data["response"].is_null()) {
        response = json_data["response"];
    }

    return 0;
}

json ServiceSubscribeMessageRequest::to_json(void) {
    json json_data = json::object();

    json_data["message_list"] = json::array();
    for (auto& item : message_list) {
        json_data["message_list"].push_back(item);
    }
    json_data["ip"] = ip;
    json_data["port"] = port;
    json_data["mac"] = mac;
    json_data["site_id"] = site_id;

    return json_data;
}

int ServiceSubscribeMessageRequest::from_json(json json_data) {
    if (json_data["message_list"].is_array()) {
        for (auto& json_item : json_data["message_list"]) {
            if (json_item.is_string()) {
                string item = json_item;
                message_list.push_back(item);
            }
        }
    }

    if (json_data["ip"].is_string()) {
        ip = json_data["ip"];
    }
    else {
        return -1;
    }

    if (json_data["port"].is_number_integer()) {
        port = json_data["port"];
    }
    else {
        return -2;
    }

    if (json_data["mac"].is_string()) {
        mac = json_data["mac"];
    }
    else {
        return -3;
    }

    if (json_data["site_id"].is_string()) {
        site_id = json_data["site_id"];
    }
    else {
        return -4;
    }

    return 0;
}

json ServiceSubscribeMessageResponse::to_json(void) {
    json json_data = json::object();


    return json_data;
}

int ServiceSubscribeMessageResponse::from_json(json json_data) {
    return 0;
}

json ServiceUnsubscribeMessageRequest::to_json(void) {
    json json_data = json::object();

    json_data["message_list"] = json::array();
    for (auto& item : message_list) {
        json_data["message_list"].push_back(item);
    }
    json_data["port"] = port;
    json_data["mac"] = mac;
    json_data["site_id"] = site_id;

    return json_data;
}

int ServiceUnsubscribeMessageRequest::from_json(json json_data) {
    if (json_data["message_list"].is_array()) {
        for (auto& json_item : json_data["message_list"]) {
            if (json_item.is_string()) {
                string item = json_item;
                message_list.push_back(item);
            }
        }
    }

    if (json_data["port"].is_number_integer()) {
        port = json_data["port"];
    }
    else {
        return -1;
    }

    if (json_data["mac"].is_string()) {
        mac = json_data["mac"];
    }
    else {
        return -2;
    }

    if (json_data["site_id"].is_string()) {
        site_id = json_data["site_id"];
    }
    else {
        return -3;
    }

    return 0;
}

json ServiceUnsubscribeMessageResponse::to_json(void) {
    json json_data = json::object();


    return json_data;
}

int ServiceUnsubscribeMessageResponse::from_json(json json_data) {
    return 0;
}
